package com.xinyue.design.strategy.wayOne;

/**上下文，负责和具体的策略类交互，是算法管家。
 * <name>
 * 算法管家类
 * <name>
 * 实现方式一：
 * 在策略模式中，通常是上下文使用具体的策略实现对象，反过来，策略实现对象也可以从上下文获取所需要的数据，因此可以将上下文当参数传递给策略实现对象。
 * 
 *  对于一系列算法的实现上存在公共功能的情况，策略模式可以有如下三种实现方式：
 *  1、在上下文当中实现公共功能，让所有具体的策略算法回调这些方法。<推荐>
 *  2、把策略的接口改成抽象类，然后在里面实现具体算法的公共功能。<推荐>
 *  3、给所有的策略算法定义一个抽象的父类，让这个父类去实现策略的接口，然后在这个父类里面去实现公共的功能。
 */
public class PriceContext {

	//各个算法中要用到的参数放到这里。由算法管家统一管理。在具体的实现类中按需索取。
	private double price;
	//信誉价
	private double creditPrice;
	
	//上下文对象，持有一个具体的策略对象。算法管家管理算法。
	private PriceStrategy priceStrategy;
    
	//构造器
    public PriceContext(double price, double creditPrice, PriceStrategy priceStrategy) {
    	this.price = price;
    	this.creditPrice = creditPrice;
        this.priceStrategy = priceStrategy;
     }
    
    ////上下文对客户端提供的操作接口，可以有参数和返回值
	public double pay() {
		return priceStrategy.pay(this);
	}
	
	//参数只有get方法，通过构造器初始化。
	public double getPrice() {
		return price;
	}
	public double getCreditPrice() {
		return creditPrice;
	}
}
